package com.两个栈实现队列and两个队列实现栈.两个栈实现队列;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**从上图中可以看出，用来实现栈的两个队列是不区分用途的，也就是说两个队列都具备插入和弹出的功能。之所以可以这么做的原因就是，他要保证任何时候都只有一个队列中有元素。

上图的插入操作，插入H的时候，两个队列都为空，优先选择从queue1插入。 当想要插入O的时候，由于queue1中已经包含了数据，那么就讲O插入queue2中，然后再将queue1中的数据依次插入queue2。实现代码如下：

再来一张图，看看如何使用两个队列来实现栈的弹出操作。

由于我们在插入的时候，保证了两个队列中只有一个队列包含数据，并且数据的顺序已经调整好了（包含数据的那个队列的队列头就是整个栈的栈顶），那么就直接从有数据的那个队列中往外弹数据就可以了。实现代码如下：
 * @author DELL
 *
 */
public class MyStack {

	private Queue<Integer> a = new ConcurrentLinkedQueue<>();
	private Queue<Integer> b = new ConcurrentLinkedQueue<>();

	public void push(int x) {
		if (a.isEmpty() && b.isEmpty()) {
			a.offer(x);
			return;
		}
		if (a.isEmpty()) {
			a.offer(x);
			while (!b.isEmpty()) {
				a.offer(b.poll());
			}
		} else {
			b.offer(x);
			while (!a.isEmpty()) {
				b.offer(a.poll());
			}
		}
	}

	public int pop() {
		if (a.isEmpty()) {
			return b.poll();
		} else {
			return a.poll();
		}
	}

	public static void main(String[] args) {
		MyStack q = new MyStack();
		q.push(12);
		q.push(100);
		q.push(24);
		System.out.println(q.pop());
		System.out.println(q.pop());
		q.push(1);
		q.push(14);
		System.out.println(q.pop());
		System.out.println(q.pop());
		System.out.println(q.pop());
	}

}
